<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件

/**
 * 发送curl请求
 */
function httpRequest($url, $postData=[],$header=["Content-Type: application/json"])
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    if(!empty($postData)){
        // 设置POST请求的选项
        curl_setopt($ch, CURLOPT_POST, true);
        // 设置POST请求传递的数据
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    }
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    // 设置请求头信息
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    $result = curl_exec($ch);
    curl_close($ch);
    return json_decode($result,true);
}

/**
 * 获取两个日期中间所有日期
 * @param $startdate 开始时间
 * @param $enddate 结束时间
*/
function getDateFromRange($start_day, $end_day)
{
    if($start_day == $end_day){
        return [
            $start_day
        ];
    }
    $day_start = strtotime($start_day);
    $day_end = strtotime($end_day);
    $days =[];
    for($i=$day_start;$i<=$day_end;$i=$i +86400) {
        $temp_day=date('Y-m-d',$i);
        array_push($days,$temp_day);
    }
    return $days;
}

function headerFields()
{
    return [
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ',
        'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV', 'BW', 'BX', 'BY', 'BZ',
        'CA', 'CB', 'CC', 'CD', 'CE', 'CF', 'CG', 'CH', 'CI', 'CJ', 'CK', 'CL', 'CM', 'CN', 'CO', 'CP', 'CQ', 'CR', 'CS', 'CT', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ',
        'DA', 'DB', 'DC', 'DD', 'DE', 'DF', 'DG', 'DH', 'DI', 'DJ', 'DK', 'DL', 'DM', 'DN', 'DO', 'DP', 'DQ', 'DR', 'DS', 'DT', 'DU', 'DV', 'DW', 'DX', 'DY', 'DZ',
        'EA', 'EB', 'EC', 'ED', 'EE', 'EF', 'EG', 'EH', 'EI', 'EJ', 'EK', 'EL', 'EM', 'EN', 'EO', 'EP', 'EQ', 'ER', 'ES', 'ET', 'EU', 'EV', 'EW', 'EX', 'EY', 'EZ',
        'FA', 'FB', 'FC', 'FD', 'FE', 'FF', 'FG', 'FH', 'FI', 'FJ', 'FK', 'FL', 'FM', 'FN', 'FO', 'FP', 'FQ', 'FR', 'FS', 'FT', 'FU', 'FV', 'FW', 'FX', 'FY', 'FZ',
        'GA', 'GB', 'GC', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GJ', 'GK', 'GL', 'GM', 'GN', 'GO', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GV', 'GW', 'GX', 'GY', 'GZ',
        'HA', 'HB', 'HC', 'HD', 'HE', 'HF', 'HG', 'HH', 'HI', 'HJ', 'HK', 'HL', 'HM', 'HN', 'HO', 'HP', 'HQ', 'HR', 'HS', 'HT', 'HU', 'HV', 'HW', 'HX', 'HY', 'HZ',
        'IA', 'IB', 'IC', 'ID', 'IE', 'IF', 'IG', 'IH', 'II', 'IJ', 'IK', 'IL', 'IM', 'IN', 'IO', 'IP', 'IQ', 'IR', 'IS', 'IT', 'IU', 'IV', 'IW', 'IX', 'IY', 'IZ',
        'JA', 'JB', 'JC', 'JD', 'JE', 'JF', 'JG', 'JH', 'JI', 'JJ', 'JK', 'JL', 'JM', 'JN', 'JO', 'JP', 'JQ', 'JR', 'JS', 'JT', 'JU', 'JV', 'JW', 'JX', 'JY', 'JZ',
    ];
}

// 巨量消耗下载公共字段
function commonFieldJuliang()
{
    return [
        'fileName',
        'mid',
        'tos_url',
        'createTime',
        'date',
        'brand',
        'product_name',
        'username',
        'direct_username',
        'camera_username',
    ];
}

// 巨量消耗下载 字段名与中文名映射关系
function enToCnFieldJuliang()
{
    return [
        'fileName'                          => '视频标题',
        'mid'                               => '视频ID',
        'tos_url'                           => '视频链接',
        'createTime'                        => '视频创建时间',
        'date'                              => '统计周期',
        'brand'                             => '品牌',
        'product_name'                      => '产品',
        'username'                          => '上传人',
        'direct_username'                   => '编导',
        'camera_username'                   => '摄像',
        'stat_cost'                         => '消耗',
        'total_play'                        => '播放量',                       
        'valid_play'                        => '有效播放数',
        'valid_play_cost'                   => '有效播放成本',
        'valid_play_rate'                   => '有效播放率',
        'average_play_time_per_play'        => '平均单次播放时长',
        'play_over'                         => '播放完成数',
        'play_over_rate'                    => '完播率',
        'play_duration_2s_rate'             => '2秒播放率',
        'play_duration_3s_rate'             => '3秒播放率',
        'play_duration_5s_rate'             => '5秒播放率',
        'play_duration_10s_rate'            => '10秒播放率',
        'dy_like'                           => '点赞数',
        'dy_comment'                        => '评论量',
        'dy_share'                          => '分享量',
        'dislike_cnt'                       => '不感兴趣数',
        'report_cnt'                        => '举报数',
        'play_25_feed_break_rate'           => '25%进度播放率',
        'play_50_feed_break_rate'           => '50%进度播放率',
        'play_75_feed_break_rate'           => '75%进度播放率',
        'play_99_feed_break_rate'           => '99%进度播放率',
        'luban_live_enter_cnt'              => '直播间观看数',
        'luban_live_follow_cnt'             => '直播间关注数',
        'luban_live_slidecart_click_cnt'    => '直播间查看购物车数',
        'dy_follow'                         => '粉丝量',
        'message_action'                    => '私信数',
        'dy_home_visited'                   => '主页访问量',
        'click_landing_page'                => '推广页访问量',
        'show_cnt'                          => '展示数',
        'cpm_platform'                      => '平均千次展现费用(元)',
        'click_cnt'                         => '点击数',
        'ctr'                               => '点击率',
        'cpc_platform'                      => '平均点击单价(元)',
        'convert_cnt'                       => '转化数',
        'conversion_cost'                   => '平均转化成本',
        'conversion_rate'                   => '转化率',
        'deep_convert_cnt'                  => '深度转化数',
        'deep_convert_cost'                 => '深度转化成本',
        'deep_convert_rate'                 => '深度转化率',
        'convert_show_rate'                 => '展示转化率',
    ];
}

/**
 * 验证URL是否合法
 */
function isValidUrlRegex($url) 
{
    // 正则表达式模式，验证URL的基本格式
    $pattern = "/\b((https?|ftp):\/\/[-\w+&@#\/%?=~_|!:,.;]*[-\w+&@#\/%=~_|])/i";
    return preg_match($pattern, $url) === 1;
}

function generateUniqueLogId($prefix = '') 
{
    // 使用更安全的随机字节生成方法
    $randomBytes = random_bytes(8);
    // 转换为十六进制字符串
    $hexUniqId = bin2hex($randomBytes);
    // 生成唯一ID
    $uniqueId = $prefix . time() . '-' . $hexUniqId;
    return $uniqueId;
}

function generateIdByPrefix($prefix = '')
{
    return $prefix . str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT) . rand(100000, 999999);
}

function arraysAreEqual($array1, $array2) 
{
    // 首先检查数组的长度是否相同
    if (count($array1) !== count($array2)) {
        return false;
    }
    
    // 遍历数组1的所有元素
    foreach ($array1 as $key => $value) {
        // 检查是否在数组2中存在相同的键
        if (!array_key_exists($key, $array2)) {
            return false;
        }
        
        // 如果该元素是数组，递归比较
        if (is_array($value)) {
            if (!is_array($array2[$key]) || !arraysAreEqual($value, $array2[$key])) {
                return false;
            }
        } else {
            // 非数组元素则直接比较值
            if ($value !== $array2[$key]) {
                return false;
            }
        }
    }

    return true;
}

function hasDuplicates($array, $field) {
    $fieldValues = array_column($array, $field);
    return count($fieldValues) !== count(array_unique($fieldValues));
}